package com.main.controller;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.generico.dao.ctg.CtgCatalogoDao;
import com.generico.exception.AsiWebException;
import com.main.dao.CompraDao;
import com.main.dao.DocumentoAdjuntoDao;
import com.main.java.Compra;
import com.main.java.DocumentoAdjunto;
import com.main.service.DocumentoAdjuntoService;
import com.web.util.GenericoUtil;

@Controller
@RequestMapping("/documentoAdjunto")
public class DocumentoAdjuntoController extends BaseController{
	
	@Autowired
	private DocumentoAdjuntoDao documentoAdjuntoDao;
	
	@Autowired
	private DocumentoAdjuntoService documentoAdjuntoService;
	
	@Autowired
	private CtgCatalogoDao ctgCatalogoDao;

	@Autowired
	private CompraDao compraDao;
	
	private static final String PDF_ICON = "pdf_icon";
	private static final String DOC_ICON = "doc_icon";
	private static final String XLS_ICON = "xls_icon";
	private static final String IMG_ICON = "img_icon";
	private static final String FILE_ICON = "file_icon";
	private static Long kycUploadMaxSize;

	@RequestMapping(value = "/view", method = {RequestMethod.GET, RequestMethod.POST})
	public void view(HttpServletResponse response, @RequestParam(value="usuarioId") Long userId, @RequestParam(value="tipoDigitalizacion") String tipoDigitalizacion) {
		Map<String, Object> model = new HashMap<String, Object>();
		model.put("fileSystem", getJsonTree(userId, tipoDigitalizacion));
		model.put("ctgTipoDocumentoAdjunto", JSONArray.fromObject(ctgCatalogoDao.findAllActivesAsArray(GenericoUtil.CTG_TIPO_DOCUMENTO_ADJUNTO)));
		model.put(SUCCESS, true);
		serializeObject(model, response);
	}

	private String getJsonTree(Long userId, String tipoDigitalizacion) {
		List<Map<String, Object>> listaHijos = new ArrayList<Map<String, Object>>();
		Map<String, Object> fileTree = new HashMap<String, Object>();
		
		if (tipoDigitalizacion.equals("adjuntarFacturaCompra")) {
			List<Compra> documentosAdjuntos = compraDao.getRecords(userId);
			fileTree.put("text", "DOCUMENTOS - FACTURAS DE COMPRAS");
			fileTree.put("expanded", true);
			Map<String, Object> child = null;
			if (!GenericoUtil.isEmptyList(documentosAdjuntos)) {
				for (Compra documento : documentosAdjuntos) {
					child = new HashMap<String, Object>();
					child.put("text", documento.getCtgProveedor());
					child.put("leaf", true);
					child.put("iconCls", XLS_ICON);
					child.put("resources", "");
					child.put("fileLocation", documento.getCompra_imagen());
					listaHijos.add(child);
				}
			}
		} else {
			List<DocumentoAdjunto> documentosAdjuntos = documentoAdjuntoDao.getRecords(userId);
			
			
			fileTree.put("text", "DOCUMENTOS - ASI No." + userId);
			fileTree.put("expanded", true);
			Map<String, Object> child = null;
			if (!GenericoUtil.isEmptyList(documentosAdjuntos)) {
				for (DocumentoAdjunto documento : documentosAdjuntos) {
					child = new HashMap<String, Object>();
					child.put("text", documento.getDocumentoAdjuntoDescripcion());
					child.put("leaf", true);
					child.put("iconCls", getIconCls(documento.getDocumentoAdjuntoExtension()));
					child.put("resources", "");
					child.put("fileLocation", documento.getDocumentoAdjuntoId());
					listaHijos.add(child);
				}
			}
		}
		
		
		
		
		
		
		
		
		
		
		fileTree.put("children", listaHijos);
		return JSONObject.fromObject(fileTree).toString();
	}

	private String getIconCls(String extension) {
		String iconCls = "";
		if(GenericoUtil.isExcel(extension)) iconCls = XLS_ICON;
		else if(GenericoUtil.isWord(extension)) iconCls = DOC_ICON;
		else if(GenericoUtil.isPdf(extension)) iconCls = PDF_ICON;
		else if(GenericoUtil.isImage(extension)) iconCls = IMG_ICON;
		else iconCls = FILE_ICON;
		return iconCls;
	}

	@RequestMapping(value = "/upload", method = {RequestMethod.GET, RequestMethod.POST})
	public void upload(HttpServletRequest request, HttpServletResponse response,
			@RequestParam(value="uploadFile") CommonsMultipartFile uploadFile, @RequestParam(value="tipoDigitalizacion") String tipoDigitalizacion,
//			@RequestParam(value="ctgDocumentoDescripcion") String ctgDocumentoDescripcion,
			@ModelAttribute(value="documentoAdjunto") DocumentoAdjunto documentoAdjunto){
		Map<String, Object> result = null;
		if(StringUtils.isBlank(documentoAdjunto.getDocumentoAdjuntoDescripcion()))
//			documentoAdjunto.setDocumentoAdjuntoDescripcion(ctgDocumentoDescripcion);

		documentoAdjunto.setDocumentoAdjuntoDescripcion(StringUtils.upperCase(documentoAdjunto.getDocumentoAdjuntoDescripcion()));

		documentoAdjunto.setDocumentoAdjuntoFecha(GenericoUtil.dateFormatAsDD_MM_YYYY___HH_MM_SS_A.format(new Date()));

		try {
			result = documentoAdjuntoService.upload(documentoAdjunto, getKycUploadMaxSize(), uploadFile);

			if(result.get(FAILURE) == null || (Boolean) result.get(FAILURE) == false)
				documentoAdjuntoService.uploadBlob(uploadFile, documentoAdjunto.getDocumentoAdjuntoId(), tipoDigitalizacion);

//			result.put("fileSystem",getJsonTree(documentoAdjunto.getKyc().getKycId()));
			result.put("fileSystem",getJsonTree(documentoAdjunto.getDocumentoAdjuntoId(), tipoDigitalizacion));
		} catch (AsiWebException e) {
			if(result == null) result = new HashMap<String, Object>();
			result.put(FAILURE, true);
			result.put(MESSAGE, GenericoUtil.getExceptionMessage(e));
		}
		serializeObject(result, response);
	}

	@RequestMapping(value = "/delete", method = {RequestMethod.GET, RequestMethod.POST})
	public void delete(HttpServletRequest request, HttpServletResponse response,
			@RequestParam(value="documentoAdjuntoId") Long documentoAdjuntoId){
		Map<String, Object> result = new HashMap<String, Object>();
		try{
			documentoAdjuntoDao.delete(documentoAdjuntoId);
			result.put(SUCCESS, true);
			result.put(MESSAGE, "Archivo Eliminado con exito");
		} catch (Exception e) {
			result.put(MESSAGE, GenericoUtil.ERROR_MESSAGE);
			result.put(FAILURE, true);
		}
		serializeObject(result, response);
	}

	@RequestMapping(value = "/viewFile", method = {RequestMethod.GET, RequestMethod.POST})
	public void viewFile(HttpServletResponse response,
			@RequestParam("codigo") String codigo) {
		try {
			Long idDocumentoAdjunto = new Long(StringUtils.defaultIfEmpty(codigo, "0"));
			DocumentoAdjunto documentoAdjunto = documentoAdjuntoDao.findById(idDocumentoAdjunto);
			if (documentoAdjunto == null || documentoAdjunto.getDocumentoAdjuntoBytes() == null || documentoAdjunto.getDocumentoAdjuntoBytes().length == 0) {
				response.getWriter().write("<h1>DOCUMENTO NO ENCONTRADO</h1>");
				return;
			}
			String extension = documentoAdjunto.getDocumentoAdjuntoExtension();
			byte[] archivo = documentoAdjunto.getDocumentoAdjuntoBytes();
			String nombreArchivo = documentoAdjunto.getDocumentoAdjuntoDescripcion() + "." + extension;

			response.setHeader("Content-Length", String.valueOf(archivo.length));
			response.setHeader("Content-Disposition", "inline; filename=\"" + nombreArchivo + "\"");

			if(GenericoUtil.isImage(extension)) response.setContentType("image/jpg");
			else if(GenericoUtil.isPdf(extension)) response.setContentType("application/pdf");
			else if(GenericoUtil.isWord(extension)) response.setContentType("application/msword");
			else if(GenericoUtil.isExcel(extension)) response.setContentType("application/msexcel");
			else response.setContentType("application/octet-stream");

			ServletOutputStream out = response.getOutputStream();
			ByteArrayInputStream bais = new ByteArrayInputStream(archivo);

			byte[] outputByte = new byte[2048];
			while (bais.read(outputByte, 0, 2048) != -1) out.write(outputByte, 0, 2048);
			bais.close();
			out.flush();
			out.close();
		} catch (Exception e) {
			logger.error("Problemas recuperando informacion de archivo digitalizado", e);
			try {
				response.setContentType("text/html");
				response.getWriter().write("<h1>DOCUMENTO NO ENCONTRADO</h1>");
			} catch (IOException e1) {
				logger.error("Error", e1);
			}
		}
	}

	private Long getKycUploadMaxSize(){
		if(kycUploadMaxSize == null) kycUploadMaxSize = Long.valueOf(GenericoUtil.trimToZero(GenericoUtil.FILE_UPLOAD_MAX_SIZE));
		return kycUploadMaxSize;
	}
	
	
	
	
	@RequestMapping(value = "/viewFoto", method = {RequestMethod.GET, RequestMethod.POST})
	public void viewFoto(HttpServletResponse response,
			@RequestParam("codigo") String codigo) {
		try {
			Long idDocumentoAdjunto = new Long(StringUtils.defaultIfEmpty(codigo, "0"));
			DocumentoAdjunto documentoAdjunto = documentoAdjuntoDao.findById(idDocumentoAdjunto);
			if (documentoAdjunto == null || documentoAdjunto.getDocumentoAdjuntoBytes() == null || documentoAdjunto.getDocumentoAdjuntoBytes().length == 0) {
				response.getWriter().write("<h1>DOCUMENTO NO ENCONTRADO</h1>");
				return;
			}
			String extension = documentoAdjunto.getDocumentoAdjuntoExtension();
			byte[] archivo = documentoAdjunto.getDocumentoAdjuntoBytes();
			String nombreArchivo = documentoAdjunto.getDocumentoAdjuntoDescripcion() + "." + extension;

			response.setHeader("Content-Length", String.valueOf(archivo.length));
			response.setHeader("Content-Disposition", "inline; filename=\"" + nombreArchivo + "\"");

			if(GenericoUtil.isImage(extension)) response.setContentType("image/jpg");
			else if(GenericoUtil.isPdf(extension)) response.setContentType("application/pdf");
			else if(GenericoUtil.isWord(extension)) response.setContentType("application/msword");
			else if(GenericoUtil.isExcel(extension)) response.setContentType("application/msexcel");
			else response.setContentType("application/octet-stream");

			ServletOutputStream out = response.getOutputStream();
			ByteArrayInputStream bais = new ByteArrayInputStream(archivo);

			byte[] outputByte = new byte[2048];
			while (bais.read(outputByte, 0, 2048) != -1) out.write(outputByte, 0, 2048);
			bais.close();
			out.flush();
			out.close();
		} catch (Exception e) {
			logger.error("Problemas recuperando informacion de archivo digitalizado", e);
			try {
				response.setContentType("text/html");
				response.getWriter().write("<h1>DOCUMENTO NO ENCONTRADO</h1>");
			} catch (IOException e1) {
				logger.error("Error", e1);
			}
		}
	}
	
	
	
	
	
	
	
	
	
}